package com.lagou.rpc.consumer;

import com.lagou.rpc.api.IUserService;
import com.lagou.rpc.consumer.proxy.RpcClientProxy;
import com.lagou.rpc.pojo.User;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * ---- 客户端集成spring boot
 * 1.客户端引入spring boot依赖
 * 2.实现CommandLineRunner接口，重写run方法
 *
 * ---- 客户端提供Controller层,在浏览器发起用户查询功能
 * 3.引入spring boot web依赖，创建UserController类，提供web接口
 * 4.实现IUserService接口，提供getById方法
 *
 * ---- 服务端提供2个或2个以上的服务
 * 5.新增一个module，lg-rpc-provider2，代码和lg-rpc-provider基本一样，提供新的端口，作为第二个服务端服务
 * 6.客户端访问新的服务端需要修改RpcClient的构造参数--端口
 *
 * ---- 客户端完成对服务端的负载轮询调用
 * 7.新增LoadBalance和实现类LoadBalanceImpl，实现轮询算法，提供getServer()方法获取服务端IP和端口
 * 8.加载服务端的地址，端口配置，这里简单创建list，然后调用LoadBalanceImpl1.getServer()方法轮询获取服务端IP和Port
 * 9.修改RpcClient类为单例模式(静态内部类)，并增加成员变量LOAD_BALANCE初始化LoadBalanceImpl()，加载所有服务(模拟
 *      读取配置文件)，该成员变量为静态，只加载一次(初始化)
 * 10.LOAD_BALANCE.getServer()方法轮询获取服务端IP和Port
 */
@SpringBootApplication
public class ClientBootStrapApplication implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(ClientBootStrapApplication.class, args);
    }

    @Override
    public void run(String... args) {
        IUserService userService = (IUserService) RpcClientProxy.createProxy(IUserService.class);
        User user1 = userService.getById(1);
        User user2 = userService.getById(2);
        User user3 = userService.getById(2);
        User user4 = userService.getById(2);
        User user5 = userService.getById(2);
        User user6 = userService.getById(2);
        User user7 = userService.getById(2);
        User user8 = userService.getById(2);
        System.out.println(user1);
        System.out.println(user2);
        System.out.println(user3);
        System.out.println(user4);
        System.out.println(user5);
        System.out.println(user6);
        System.out.println(user7);
        System.out.println(user8);
    }

}
